Scala入门(三):集合

最近在做一个spark项目,顺便分享一下我的Scala入门过程。这一系列文章假定读者有一定的java或者其他面向对象编程语言基础。本文主要简单介绍Scala的集合类型,包括Array,Tuple和Map。

照例先上一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
object TestScala3 {  
def main(args: Array[String]): Unit = {
val tuple = (1, "two", "three", true)
println(tuple._1)
println(tuple._2)

val array = Array(1, "two", "three", true)
for (i <- 0 until array.length) {
println(array(i))
}
for (item <- array) println(item)

val map = Map(1 -> "one", "two" -> 2, true -> "true")
for ((k, v) <- map) println("key = " + k + ", value = " + v)
for ((_, v) <- map) println("value = " + v)
println(map.get(1))
println(map.get(3))
}
}

第一个例子,我们创建了一个4个元素的tuple,并打印出它的前两个元素。tuple是一个元组,它可以包含若干个不同类型的元素(在Scala2.8之后,Array和List也支持不同类型的元素)。在取用tuple中的元素时,使用下划线加index的语法,但注意,与其他集合不同,tuple的index是从1开始的,实际上当你尝试写tuple._0时,会有得到编译错误“value _0 is not a member of (Int, String, String, Boolean)”, 并没有0这个下标。另外我们也从编译错误信息中看到,Scala具备类型推导的能力,它能够知道元组中的每个元素的类型。

在Java的函数中,如果我们想返回多个值,只能新建一个POJO去接,或者把返回值写入参数传入的引用中,非常麻烦,但在Scala中我们使用tuple就非常方便。

第二个例子,我们生命了一个Array,遍历并打印出Array中的每个元素。这里我们用到0until N,在上篇中我们写过0 to N,他们的区别在于until是一个前闭后开的函数,并不包括N,而to包括。

第三个例子,map储存的是键值对,用->声明。遍历时,把map中的每个键值对赋值给一个两个元素的tuple,再将这个tuple的两个元素打印出来。如果我们只关心map中的key或者value,我们可以使用占位符(_)来替代不关心的元素。